import 'dart:ui';

import '../utils/color_utils.dart';
import 'base/base_effect.dart';
import 'effect_template.dart';

class Effect27 extends EditableAnimationEffect {

  List<Map<int, int>> whiteList = [];

  @override
  List<Color> get defaultColors {
    return const [
      Color(0xFFff0000),
    ];
  }

  @override
  bool get enableAngle => true;

  @override
  RangeArgument get angleRange => RangeArgument(-180, 180, 0);

  @override
  bool get enableColorWidth => false;
  @override
  RangeArgument get colorCountRange => RangeArgument(1, 6, 0);

  @override
  bool get enableDensity => false;

  @override
  bool get enableEditColor => false;

  @override
  bool get enableSpeed => false;

  @override
  bool get isFixedColorCount => false;

  @override
  EffectType get effectTyp => EffectType.effect27;

  @override
  Future<List<List<List<Color>>>> getFrames({EffectOperation? operation}) {

    // 调用 getColorList 方法获取颜色列表，并取第一个颜色
    Color color = getColorList(effectOperation: operation).first;

    // 定义三个颜色：黑色、渐变色、黑色
    List<Color> colorList = [
      color,
      Color(0xFFffffff),
      color,
    ];

    // 获取渐变框的宽度，如果 operation 为空则使用默认值
    int colorWidth = 8;

    // 计算每一个颜色块的长度
    double perSize = (colorWidth / colorList.length) * 2;

    // 定义每一个颜色块的停留位置
    List<double> stops =
    List.generate(colorList.length, (index) => perSize * index);
    int angle = getAngle(effectOperation: operation);
    Size rotateSize = getRotateSize(angle: angle);
    double newWidth = rotateSize.width;
    double newHeight = rotateSize.height;

    // 计算总共需要生成多少帧
    int totalFrame = newHeight.toInt() + colorWidth;

    // 定义一个空的 singleColumn 数组
    List<Color> singleColumn = [];

    // 生成渐变色列
    for (int i = 0; i < totalFrame; i++) {
      // 如果 i 小于等于渐变框的宽度，则生成渐变色
      if (i <= colorWidth) {
        // 生成渐变色
        var gradientColor =
        ColorUtils.lerpGradient(colorList, stops, i.toDouble());
        singleColumn.add(gradientColor);
      } else {
        // 超出渐变框的范围则颜色设置为黑色
        singleColumn.add(color);
      }
    }

    // 定义一个空的 frames 数组，用于存储每一帧的数据
    List<List<List<Color>>> frames = [];
    int counter = 1;

    // 遍历每一帧
    for (int i = 0; i < (totalFrame + colorWidth) * 2; i++) {
      List<List<Color>> frame = [];

      if (i <= totalFrame) {
        counter = 0;
      } else if (i > totalFrame) {
        counter = 1;
      }

      // 遍历每一列
      for (int j = 0; j < newWidth; j++) {
        List<Color> columns = [];

        // 遍历每一个颜色块，根据旋转角度计算出其实际位置
        for (int z = 0; z < newHeight; z++) {
          if ((i >= totalFrame && i <= totalFrame + colorWidth) ||
              (i >= totalFrame * 2 + colorWidth &&
                  i <= (totalFrame + colorWidth) * 2)) {
            columns.add(color);
          } else {
            columns.add(counter % 2 == 0
                ? singleColumn[(i - z) % singleColumn.length]
                : singleColumn[(i + z) % singleColumn.length]);
          }
        }
        frame.add(columns);
      }
      frames.add(frame);
    }
    return Future.value(frames);
  }

  @override
  Size get size => const Size(24, 24);
}